﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Numerics;
using System.Xml;
using System.IO;

namespace elcalc
{
    public partial class Installation : Form
    {
        Egenskaber formProp;
        ArrayList forbrugListe;

        private static Installation installationsForm = null;

        public static Installation Instance()
        {
            if (installationsForm == null)
                installationsForm = new Installation();
            return installationsForm;
        }

        public void LoadFromFile(string fileName)
        {

            XmlDocument doc = new XmlDocument();

            doc.Load(fileName);

            BuildTreeView(trvDimensionering, doc.DocumentElement);
        }

        public void SaveToFile(string fileName)
        {
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;
            settings.OmitXmlDeclaration = true;

            XmlWriter x = XmlWriter.Create(fileName, settings);


            CallWriteToFile(x, trvDimensionering);

            x.Close();
        }

        public void FyldTræMedFiktivData()
        {
            Transformer t = new Transformer();
            t.ikmax = 16;
            t.ikmax = 8;
            t.phiikmax = 1;
            t.phiikmin = 1;

            TreeNode tnt = new TreeNode();
            tnt.Text = "Transformer";
            tnt.Tag = t;

            trvDimensionering.Nodes.Add(tnt);

            Kabel k = new Kabel();
            k.Længde = 100;
            k.Navn = "test kabel 1";
            k.Z15 = new Complex(12, 1);
            k.Z115 = new Complex(24, 2);

            TreeNode tnk = new TreeNode();
            tnk.Tag = k;
            tnk.Text = k.Navn;

            trvDimensionering.Nodes[0].Nodes.Add(tnk);

            Tavle tv = new Tavle();
            TreeNode tntv = new TreeNode();
            tntv.Tag = tv;
            tntv.Text = "Tavle";

            trvDimensionering.Nodes[0].Nodes[0].Nodes.Add(tntv);

            for (int i = 0; i < 5; i++)
            {
                Kabel kk = new Kabel();
                kk.Længde = 100 + i;
                kk.Navn = "test kabel " + i;
                kk.Z15 = new Complex(i, i);
                kk.Z115 = new Complex(10 + i, 10 + i);


                TreeNode tn = new TreeNode();
                tn.Tag = kk;
                tn.Text = kk.Navn;

                Forbrug f = new Forbrug();
                f.Navn = "test forbrug " + i;
                f.Strøm = 10 + i;
                Random rnd = new Random();
                f.CosPhi = 0.95;
                f.last = lastdeling.L1L2L3;

                f.SinPhi = Math.Sin(Math.Acos(f.CosPhi));
                f.Phi = Math.Acos(f.CosPhi) * 180 / Math.PI;


                TreeNode tnf = new TreeNode();
                tnf.Text = f.Navn;
                tnf.Tag = f;

                trvDimensionering.Nodes[0].Nodes[0].Nodes[0].Nodes.Add(tn);
                trvDimensionering.Nodes[0].Nodes[0].Nodes[0].Nodes[i].Nodes.Add(tnf);
            }

            trvDimensionering.ExpandAll();
        }

        private Installation()
        {
            InitializeComponent();

            FyldTræMedFiktivData();
        }

        private void treeView1_MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right & trvDimensionering.Nodes.Count == 0)
            {
                tilføjToolStripMenuItem.Enabled = true;
                transformerToolStripMenuItem.Enabled = true;
            }
            else
            {
                //tilføjToolStripMenuItem.Enabled = false;
                transformerToolStripMenuItem.Enabled = false;
                kabelToolStripMenuItem.Enabled = true;
            }
        }

        private void transformerToolStripMenuItem_Click(object sender, EventArgs e)
        {
            frmTrafo formTransformer = new frmTrafo();
            //formTransformer.MdiParent = this.ParentForm;
            formTransformer.TransformerUpdated += new frmTrafo.TransformerUpdateHandler(formTransformer_TransformerUpdated);
            formTransformer.ShowDialog();
            //treeView1.Nodes.Add("Transformer", "Transformer");
            
        }

        void formTransformer_TransformerUpdated(object sender, Transformer t)
        {
            TreeNode node = new TreeNode();
            node.Tag = t;
            node.Text = "Transformer";
            trvDimensionering.Nodes.Add(node);
            //throw new NotImplementedException();
        }

        private void kabelToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Object obj = trvDimensionering.SelectedNode.Tag;
            if (obj is Transformer | obj is Tavle)
            {
                KabelForm formKabel = new KabelForm();
                formKabel.KabelOpdateret += new KabelForm.KabelOpdateretHandler(formKabel_KabelOpdateret);
                formKabel.ShowDialog();
                

                //trvDimensionering.Nodes[trvDimensionering.SelectedNode.Index].Nodes.Add("Kabel","kabel");
                //treeView1.SelectedNode.Nodes.Add("kabel");
            }
            //treeView1.Nodes.Add("kabel", "Kabel");
        }

        void formKabel_KabelOpdateret(object sender, Kabel k)
        {
            TreeNode node = new TreeNode();
            node.Tag = k;
            node.Text = k.ToString();
            trvDimensionering.SelectedNode.Nodes.Add(node);
        }



        private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            
            if (e.Button == MouseButtons.Right)
            {
                trvDimensionering.SelectedNode = e.Node;
                //treeView1.Nodes.Add("kabel", "Kabel");         
            }
            else
            {
                if (e.Node.Tag is Forbrug)
                {
                    formProp.Show();

                    formProp.Opdater(e.Node.Tag);
                    //formEgenskaber.NytObjektValgt(e.Node.Tag);
                    //frmEgenskaber.
                    //frmEgenskaber frm = new frmEgenskaber(e.Node.Tag);
                   // formEgenskaber.MdiParent = this.ParentForm;
                    //formEgenskaber.Dock = DockStyle.Right;

                    //formEgenskaber.Show();
                    
                }
                else if (e.Node.Tag is Tavle)
                {
                    formProp.Show();

                    formProp.Regn(trvDimensionering);

                   // Debug.WriteLine(trvDimensionering.Nodes.Count);

                    for (int i=0;i==e.Node.Level;i++)
                    {
                        //e.Node.PrevNode
                    }
                    
                    /*
                    Debug.WriteLine(e.Node.FullPath);
                    Debug.WriteLine(e.Node.Index);
                    Debug.WriteLine(e.Node.Level);*/


                    CallRecursive(trvDimensionering);
                    //CallRecursiveReverse(e.Node.Nodes[0].LastNode);
                }
                else if (e.Node.Tag is Kabel)
                {
 

                    List<TreeNode> kabler = FindKabelTrækBagudNodes(e.Node);

                    Kabel kabel = e.Node.Tag as Kabel;
                    kabel.SpændingsFaldProcentSamlet = 0;

                    for (int i = 0; i < kabler.Count; i++)
                    {
                        List<Complex> kom = BeregnLast(kabler[i]);

                        Complex dimStrøm = kom[0].Magnitude;

                        for (int j = 0; j < kom.Count; j++)
                        {


                            if (j + 1 < kom.Count)
                            {
                                if (kom[j].Magnitude < kom[j + 1].Magnitude)
                                    dimStrøm = kom[j + 1];
                                else if ((kom[j].Magnitude == kom[j + 1].Magnitude) && (kom[j].Phase < kom[j + 1].Phase))
                                    dimStrøm = kom[j + 1];
                            }

                        }
                       //int index = trvDimensionering.Nodes.IndexOf(kabler[i]);
                        //trvDimensionering.Nodes.Remove(kabler[i]);
                        Kabel k = kabler[i].Tag as Kabel;
                        k.SpændingsFald = dimStrøm.Magnitude * (k.Z15.Real * Math.Cos(dimStrøm.Phase) + k.Z15.Imaginary * Math.Sin(dimStrøm.Phase)) * Math.Pow(10, -3);

                        // TODO: ret til at bruge uf for transformeren (trvDimensionering.Nodes[0].Tag as Transformer).
                        k.SpændingsFaldProcent = (k.SpændingsFald / 230) * 100;

                        kabel.SpændingsFaldProcentSamlet += k.SpændingsFaldProcent;

                       Debug.WriteLine( (kabler[i].Tag as Kabel).SpændingsFald);

                       // trvDimensionering.Nodes.Insert(index, kabler[i]);

                        Debug.WriteLine(k.SpændingsFald.ToEngineering());
                        Debug.WriteLine(k.SpændingsFaldProcent);
                        double d = 123213123213;
                        Debug.WriteLine(d.ToEngineering());
                        d = 0.0000012312;
                        Debug.WriteLine(d.ToEngineering());
                        
                    }





                    formProp.Show();
                    formProp.Opdater(e.Node.Tag); 

                    /*
                    List<Complex> kom = BeregnLast(e.Node);

                    Complex dimStrøm = kom[0].Magnitude;
                    
                    for(int i=0;i<kom.Count;i++)
                    {
                        

                        if(i+1 <kom.Count)
                        {
                            if (kom[i].Magnitude < kom[i + 1].Magnitude)
                                dimStrøm = kom[i + 1];
                            else if ((kom[i].Magnitude == kom[i + 1].Magnitude) && (kom[i].Phase < kom[i + 1].Phase))
                                dimStrøm = kom[i + 1];
                        }

                    }

                    if (ErDerEnTavleEfterfølgende(e.Node))
                    {
                        Kabel k = e.Node.Tag as Kabel;
                        double test = dimStrøm.Magnitude * (k.Z15.Real * Math.Cos(dimStrøm.Phase) + k.Z15.Imaginary * Math.Sin(dimStrøm.Phase))*Math.Pow(10,-3);
                        Debug.WriteLine(test.ToString());
                        
                    }

                    */
                    

                    // IB * (R*cos+X*sin)

                }
                else
                {
                    formProp.Hide();
                }
            }
        }

        private void ErstatNode(TreeNode startNode, TreeNode søgEfterNode, TreeNode erstatMedNode)
        {
            for (int i = 0; i < startNode.Nodes.Count; i++ )
            {
                if (startNode.Nodes[i].Equals(søgEfterNode))
                {
                    startNode.Nodes[i] = erstatMedNode;
                }

                ErstatNode(startNode.Nodes[i], søgEfterNode, erstatMedNode);
            }
        }


        private void SætBelastningsStrømPåEnhederFraForbrug(TreeNode treeNode, Forbrug forbrug)
        {
            if (treeNode.Tag is Kabel)
            {
                Kabel k = treeNode.Tag as Kabel;
            }
            
            if (treeNode.Parent != null)
            {

            }
        }

        // TODO: Behøves der sættes strømforbrug på alle enheder? formlen for spændingsfald i den enkelte
        // leder er det samme uanset lastdeling.

        private bool ErDerEnTavleEfterfølgende(TreeNode treeNode)
        {
            bool result = false;

            if (treeNode.Tag is Tavle)
            {
                result = true;
                return result;
            }

            foreach (TreeNode subNode in treeNode.Nodes)
            {
                result = ErDerEnTavleEfterfølgende(subNode);
            }

            return result;
        }

        private void CallRecursiveReverse(TreeNode treeNode)
        {
            if (treeNode.Parent != null)
            {
                Debug.WriteLine(treeNode.Text);
                CallRecursiveReverse(treeNode.Parent);
            }
        }

        private void PrintRecursive(TreeNode treeNode)
        {
            // Print the node.
            System.Diagnostics.Debug.WriteLine(treeNode.Text);
           // MessageBox.Show(treeNode.Text);
            // Print each node recursively.
            foreach (TreeNode tn in treeNode.Nodes)
            {
                PrintRecursive(tn);
            }
        }


        

        // Call the procedure using the TreeView.
        private void CallRecursive(TreeView treeView)
        {
            // Print each node recursively.
            TreeNodeCollection nodes = treeView.Nodes;
            foreach (TreeNode n in nodes)
            {
                PrintRecursive(n);
            }
        }


        private void tavleToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (trvDimensionering.SelectedNode.Tag is Kabel)
            {
                TreeNode node = new TreeNode();
                node.Text = "Tavle";
                node.Tag = new Tavle();
                trvDimensionering.SelectedNode.Nodes.Add(node);
                //treeView1.Nodes[treeView1.SelectedNode.Index].Nodes.Add("Tavle", "Tavle");
            }
        }

        private void brugsgenstandToolStripMenuItem_Click(object sender, EventArgs e)
        {
            
            if (trvDimensionering.SelectedNode.Tag is Kabel)
            {
                Belastning frm = new Belastning();
                frm.ForbrugTilføjet += new Belastning.ForbrugTilføjetHandler(frm_ForbrugTilføjet);
                frm.ShowDialog();
            }
        }

        void frm_ForbrugTilføjet(Forbrug f)
        {
            TreeNode node = new TreeNode();
            node.Text = f.Navn;
            node.Tag = f;
            trvDimensionering.SelectedNode.Nodes.Add(node);
        }

        private void Form1_Shown(object sender, EventArgs e)
        {
            formProp = Egenskaber.GetInstance();
            formProp.MdiParent = MdiParent;
            formProp.Dock = DockStyle.Right;
        }

        private void visBelastningsplanToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (trvDimensionering.SelectedNode.Tag is Tavle)
            {
                Debug.WriteLine("vil vise belastningsplan for tavle");

                forbrugListe = new ArrayList();

                FindForbrugPåTavle(trvDimensionering.SelectedNode);
                List<TreeNode> list = FindForbrug(trvDimensionering.SelectedNode);

                BelastningsPlan childForm = new BelastningsPlan(forbrugListe);
                childForm.MdiParent = this.MdiParent;
                childForm.Show();

                for (int i = 0; i < forbrugListe.Count; i++)
                {
                    Debug.WriteLine(((Forbrug)forbrugListe[0]).Navn);
                }


            }
        }

        private List<Kabel> FindKabelTræk(TreeNode treeNode)
        {
            List<Kabel> result = new List<Kabel>();

            if (!treeNode.IsSelected)
            {
                if (treeNode.Tag is Kabel)
                {
                    result.Add(treeNode.Tag as Kabel);
                }

                foreach (TreeNode subNode in treeNode.Nodes)
                {
                    result.AddRange(FindKabelTræk(subNode));
                }
            }

            return result;
        }

        private List<TreeNode> FindKabelTrækBagudNodes(TreeNode treeNode)
        {
            List<TreeNode> resultat = new List<TreeNode>();

            if (treeNode.Tag is Kabel)
                resultat.Add(treeNode);

            if (treeNode.Parent != null)
            {
                resultat.AddRange(FindKabelTrækBagudNodes(treeNode.Parent));
            }

            return resultat;
        }

        private List<Kabel> FindKabelTrækBagud(TreeNode treeNode)
        {
            List<Kabel> resultat = new List<Kabel>();

            if (treeNode.Tag is Kabel)
                resultat.Add(treeNode.Tag as Kabel);

            if (treeNode.Parent != null)
            {
                resultat.AddRange(FindKabelTrækBagud(treeNode.Parent));
            }

            return resultat;
        }

        private void FindForbrugPåTavle(TreeNode treeNode)
        {
            if (treeNode.Tag is Forbrug)
            {
                forbrugListe.Add(treeNode.Tag);
            }

            foreach (TreeNode subNode in treeNode.Nodes)
            {
                FindForbrugPåTavle(subNode);
            }
        }

        private List<TreeNode> FindForbrug(TreeNode treeNode)
        {
            List<TreeNode> result = new List<TreeNode>();

            if (treeNode.Tag is Forbrug)
            {
                result.Add(treeNode);
            }

            foreach (TreeNode subNode in treeNode.Nodes)
            {
                result.AddRange(FindForbrug(subNode));
            }
            return result;
        }

        private List<Forbrug> FindForbrugSomForbrug2(TreeNode treeNode)
        {
            List<Forbrug> result = new List<Forbrug>();

            if (treeNode.Tag is Forbrug)
            {
                result.Add(treeNode.Tag as Forbrug);
            }

            foreach (TreeNode subNode in treeNode.Nodes)
            {
                result.AddRange(FindForbrugSomForbrug2(subNode));
            }
            return result;
        }

        private List<Forbrug> FindForbrugSomForbrug(TreeNode treeNode)
        {
            List<Forbrug> result = new List<Forbrug>();

            if (treeNode.Tag is Forbrug)
            {
                result.Add(treeNode.Tag as Forbrug);
            }

            foreach (TreeNode subNode in treeNode.Nodes)
            {
                result.AddRange(FindForbrugSomForbrug(subNode));
            }
            return result;
        }



        private void AddNode(XmlElement XmlParentElement, TreeNode treeParentNode)
        {
            //if (!xmlParentNode.HasChildNodes) { return; }
            foreach (XmlElement xmlElement in XmlParentElement)
            {
                TreeNode treeNode = new TreeNode();

                switch (xmlElement.Name)
                {
                    case "Kabel":
                        Kabel k = new Kabel();
                        k.Type = xmlElement.GetAttribute("Type");
                        k.Navn = xmlElement.GetAttribute("Navn");
                        k.Længde = double.Parse(xmlElement.GetAttribute("Længde"));
                        k.Z = Hjælper.ParseComplex(xmlElement.GetAttribute("Z"));
                        k.Z115 = Hjælper.ParseComplex(xmlElement.GetAttribute("Z115"));
                        k.Z15 = Hjælper.ParseComplex(xmlElement.GetAttribute("Z15"));
                        k.Zn115 = Hjælper.ParseComplex(xmlElement.GetAttribute("Zn115"));
                        k.Zn15 = Hjælper.ParseComplex(xmlElement.GetAttribute("Zn15"));
                        
                        treeNode.Text = k.Navn;
                        treeNode.Tag = k;
                        break;
                    case "Forbrug":
                        Forbrug f = new Forbrug();
                        f.Navn = xmlElement.GetAttribute("Navn");
                        f.Phi = double.Parse(xmlElement.GetAttribute("Phi"));
                        f.SinPhi = double.Parse(xmlElement.GetAttribute("SinPhi"));
                        f.CosPhi = double.Parse(xmlElement.GetAttribute("CosPhi"));
                        f.last = (lastdeling)Enum.Parse(typeof(lastdeling), xmlElement.GetAttribute("Last"));
                        f.Strøm = double.Parse(xmlElement.GetAttribute("Strøm"));

                        treeNode.Text = f.Navn;
                        treeNode.Tag = f;
                        break;
                    case "Tavle":
                        Tavle t = new Tavle();
                        treeNode.Tag = t;
                        treeNode.Text = "Tavle";
                        break;
                }
                                
                treeParentNode.Nodes.Add(treeNode);
                AddNode(xmlElement, treeNode);
            }
        }

        public void BuildTreeView(TreeView tv, XmlElement rootXmlElement)
        {
            TreeNode rootTreeNode = new TreeNode();
            Transformer t = new Transformer();
            t.ikmin = float.Parse(rootXmlElement.GetAttribute("IkMin"));
            t.ikmax = float.Parse(rootXmlElement.GetAttribute("IkMax"));
            t.phiikmin = float.Parse(rootXmlElement.GetAttribute("PhiMin"));
            t.phiikmax = float.Parse(rootXmlElement.GetAttribute("PhiMax"));
            rootTreeNode.Text = "Transformer";
            rootTreeNode.Tag = t;
            
            tv.Nodes.Clear();
            tv.Nodes.Add(rootTreeNode);

            AddNode(rootXmlElement, rootTreeNode);

            tv.ExpandAll();
        }




        private void ReadFile()
        {
            //XmlReader reader = XmlReader.Create("træ.xml");

      

            XmlDocument doc = new XmlDocument();

            doc.Load("træ.xml");

            BuildTreeView(trvDimensionering, doc.DocumentElement);

           // læsfil(doc.DocumentElement);


            #region test
            /*

            foreach (XmlElement el in doc)
            {
                Debug.WriteLine(el.Name);
                foreach (XmlElement e in el)
                {
                    Debug.WriteLine(e.Name);
                    foreach (XmlElement e1 in e)
                    {
                        Debug.WriteLine(e1.Name);
                        foreach (XmlElement e2 in e1)
                        {
                            Debug.WriteLine(e2.Name);
                            foreach (XmlElement e3 in e2)
                            {
                                Debug.WriteLine(e3.Name);
                            }
                        }
                    }
                }
            }

            





            /*
             * 
           trvDimensionering.Nodes.Clear();

            while (reader.Read())
            {
                if (reader.IsStartElement())
                {
                    if (reader.IsEmptyElement)
                        
                        //Console.WriteLine("<{0}/>", reader.Name);
                    else
                    {
                        Console.Write("<{0}> ", reader.Name);
                        reader.Read(); // Read the start tag.
                        if (reader.IsStartElement())  // Handle nested elements.
                            Console.Write("\r\n<{0}>", reader.Name);
                        Console.WriteLine(reader.Name);  //Read the text content of the element.
                    }
                }
            }

            //feach (

            /*
            TreeView tempTree = new TreeView();
            TreeNode parentNode = null;

            XmlReader reader = XmlReader.Create("træ.xml");

            while (reader.Read())
            {
                if (reader.IsStartElement())
                {
                    if (reader.IsEmptyElement)
                        Console.WriteLine("<{0}/>", reader.Name);
                    else
                    {
                        Console.Write("<{0}> ", reader.Name);
                        reader.Read(); // Read the start tag.
                        if (reader.IsStartElement())  // Handle nested elements.
                            Console.Write("\r\n<{0}>", reader.Name);
                        Console.WriteLine(reader.ReadString());  //Read the text content of the element.
                    }
                }
            } */
            #endregion


        }

        private void CallWriteToFile(XmlWriter write, TreeView tree)
        {
            TreeNodeCollection nodes = tree.Nodes;
            foreach (TreeNode node in nodes)
            {
                CallWriteToFile(write, node);
            }
        }

        private void CallWriteToFile(XmlWriter write, TreeNode node)
        {
            if (node.Tag is Forbrug)
            {
                write.WriteStartElement("Forbrug");

                Forbrug f = (Forbrug)node.Tag;
                write.WriteAttributeString("Navn", f.Navn);
                write.WriteAttributeString("Strøm", f.Strøm.ToString());
                write.WriteAttributeString("Last", f.last.ToString());
                write.WriteAttributeString("Phi", f.Phi.ToString());
                write.WriteAttributeString("SinPhi", f.SinPhi.ToString());
                write.WriteAttributeString("CosPhi", f.CosPhi.ToString());
            }
            else if (node.Tag is Kabel)
            {
                write.WriteStartElement("Kabel");

                Kabel k = (Kabel)node.Tag;
                write.WriteAttributeString("Type", k.Type);
                write.WriteAttributeString("Navn", k.Navn);
                write.WriteAttributeString("Længde", k.Længde.ToString());
                write.WriteAttributeString("Z", string.Format(new KompleksFormat(), "{0:J2}", k.Z));
                write.WriteAttributeString("Z115", string.Format(new KompleksFormat(), "{0:J2}", k.Z115));
                write.WriteAttributeString("Z15", string.Format(new KompleksFormat(), "{0:J2}", k.Z15));
                write.WriteAttributeString("Zn115", string.Format(new KompleksFormat(), "{0:J2}", k.Zn115));
                write.WriteAttributeString("Zn15", string.Format(new KompleksFormat(), "{0:J2}", k.Zn15));
            }
            else if (node.Tag is Tavle)
            {
                write.WriteStartElement("Tavle");
            }
            else if (node.Tag is Transformer)
            {
                write.WriteStartElement("Transformer");

                Transformer t = (Transformer)node.Tag;
                write.WriteAttributeString("IkMax", t.ikmax.ToString());
                write.WriteAttributeString("IkMin", t.ikmin.ToString());
                write.WriteAttributeString("PhiMax", t.phiikmax.ToString());
                write.WriteAttributeString("PhiMin", t.phiikmin.ToString());
            }


            foreach (TreeNode subnode in node.Nodes)
                CallWriteToFile(write, subnode);
            
            write.WriteEndElement();
        }

        private void kabeltrækToolStripMenuItem_Click(object sender, EventArgs e)
        {
            TreeNode oldNode = trvDimensionering.SelectedNode;
            List<Kabel> list = FindKabelTræk(trvDimensionering.Nodes[0]);
            List<TreeNode> kabler = FindKabelTrækBagudNodes(trvDimensionering.SelectedNode);
            int ikabler = kabler.Count;
            int test = list.Count;
            List<Kabel> list2 = FindKabelTrækBagud(trvDimensionering.SelectedNode);
            int test2 = list2.Count;
           // List<Kabel> = FindKabelTræk(trvDimensionering.Nodes[0]);

            List<Forbrug> list3 = FindForbrugSomForbrug(trvDimensionering.SelectedNode);
            

            for (int i = kabler.Count; i > 0; i--)
            {
                trvDimensionering.SelectedNode = kabler[i - 1];
                List<Forbrug> forbrug = FindForbrugSomForbrug2(trvDimensionering.SelectedNode);
                for (int j = 0; j <= forbrug.Count-1; j++)
                {
                    Debug.WriteLine(forbrug[j].Navn);
                    (kabler[i - 1].Tag as Kabel).Current += forbrug[j].Strøm;
                }
                //List<Forbrug> forbrug = FindForbrugSomForbrug(
                Debug.WriteLine("Forbrug på kabel " + (kabler[i-1].Tag as Kabel).Navn + " er " + (kabler[i-1].Tag as Kabel).Current);
            }

            Complex test3 = BeregnSamledeZ(list2);
            Debug.WriteLine(test3.ToString());




        }

        private Complex BeregnSamledeZ(List<Kabel> list)
        {
            Complex kompleks = new Complex();

            for (int i = 0; i < list.Count; i++)
            {
                kompleks += ((Kabel)list[i]).Z15;
            }

            return kompleks;
        }

        private Complex BeregnIB(Kabel kabel)
        {
            Complex kompleks = new Complex();

            return kompleks;
        }

        private List<Complex> BeregnLast(TreeNode treeNode)
        {
            List<Forbrug> forbrug = FindForbrugSomForbrug2(treeNode);

            Complex L1 = new Complex();
            Complex L2 = new Complex();
            Complex L3 = new Complex();

            for (int i = 0; i < forbrug.Count; i++)
            {
                Complex forbrug0 = Complex.Conjugate(Complex.FromPolarCoordinates(forbrug[i].Strøm, forbrug[i].Phi * (Math.PI / 180)));
                Complex forbrugM30 = Complex.Conjugate(Complex.FromPolarCoordinates(forbrug[i].Strøm, (forbrug[i].Phi - 30) * (Math.PI / 180)));
                Complex forbrugP30 = Complex.Conjugate(Complex.FromPolarCoordinates(forbrug[i].Strøm, (forbrug[i].Phi + 30) * (Math.PI / 180)));
                /*
                Debug.WriteLine(forbrug[i].Navn);
                Debug.WriteLine("forbrug rent            " + forbrug0.Magnitude + "<" + forbrug0.Phase * (180 / Math.PI));
                Debug.WriteLine("forbrug rent minus 30   " + forbrugM30.Magnitude + "<" + forbrugM30.Phase * (180 / Math.PI));
                Debug.WriteLine("forbrug rent plus 30    " + forbrugP30.Magnitude + "<" + forbrugP30.Phase * (180 / Math.PI));
                Debug.WriteLine("");
                 * */

                switch (forbrug[i].last)
                {
                    case lastdeling.L1L2L3:
                        L1 += forbrug0;
                        L2 += forbrug0;
                        L3 += forbrug0;
                        break;
                    case lastdeling.L1N:
                        L1 += forbrug0;
                        break;
                    case lastdeling.L2N:
                        L2 += forbrug0;
                        break;
                    case lastdeling.L3N:
                        L3 += forbrug0;
                        break;
                    case lastdeling.L1L2:
                        L1 += forbrugP30;
                        L2 += forbrugM30;
                        break;
                    case lastdeling.L1L3:
                        L1 += forbrugM30;
                        L3 += forbrugP30;
                        break;
                    case lastdeling.L2L3:
                        L2 += forbrugP30;
                        L3 += forbrugM30;
                        break;
                }

            }

            /*
            Debug.WriteLine("forbrug på l1 " + L1.Magnitude + "<" + L1.Phase * (180 / Math.PI));
            Debug.WriteLine("forbrug på l2 " + L2.Magnitude + "<" + L1.Phase * (180 / Math.PI));
            Debug.WriteLine("forbrug på l3 " + L3.Magnitude + "<" + L1.Phase * (180 / Math.PI));
             */

            return new List<Complex>() { L1, L2, L3 };

        }

        private void trvDimensionering_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            if (e.Node.Tag is Kabel)
            {
                KabelForm form = new KabelForm(e.Node.Tag as Kabel);
                form.MdiParent = this.MdiParent;
                form.KabelRedigeret += new KabelForm.KabelRedigeretHandler(form_KabelRedigeret);
                form.Show();
            }
        }

        void form_KabelRedigeret(Kabel rettetKabel)
        {
            TreeNode node = findNodePåTag(trvDimensionering.Nodes[0], rettetKabel);
        }

        private TreeNode findNodePåTag(TreeNode treeNode, Kabel k)
        {
            TreeNode result = null;

            if (treeNode.Tag.Equals(k))
            {
                return result = treeNode;
            }

            foreach (TreeNode subNode in treeNode.Nodes)
            {
                result = findNodePåTag(subNode, k);
            }

            return result;
        }

        private TreeNode findNodePåTag(TreeNode treeNode, Forbrug f)
        {
            TreeNode result = null;

            if (treeNode.Tag.Equals(f))
            {
                return result = treeNode;
            }

            foreach (TreeNode subNode in treeNode.Nodes)
            {
                result = findNodePåTag(subNode, f);
            }

            return result;
        }
    }



    
}
